package com.sunday.common.spring.study;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

/**
 * {@link org.springframework.kafka.annotation.KafkaListenerAnnotationBeanPostProcessor}
 */
@Slf4j
public class MyListenerAnnotationBeanPostProcessor implements BeanPostProcessor {

    /**
     * BeanPostProcessor 是 Spring Framework 提供的一个扩展点接口，用于在 bean 初始化过程中对 bean 进行定制化处理。
     * 具体来说，BeanPostProcessor 接口定义了两个方法：postProcessBeforeInitialization() 和 postProcessAfterInitialization()。当容器创建并初始化一个 bean 实例时，这两个方法会被自动调用，允许开发人员在 bean 初始化前后进行一些额外的处理操作。
     * 通常情况下，BeanPostProcessor 可以用于以下几个方面：
     * 自定义初始化逻辑：通过实现 BeanPostProcessor 接口，可以在 bean 初始化之前或之后执行一些自定义的初始化逻辑，例如修改属性值、执行特定的初始化方法等。
     * 添加功能扩展：通过 BeanPostProcessor 可以为 bean 动态添加额外的功能或行为。例如，可以为某个特定类型的 bean 注入特定的代理对象，以实现 AOP 风格的切面功能。
     * 检查和验证：BeanPostProcessor 可以用于检查和验证 bean 的状态或配置。例如，可以根据特定的规则检查 bean 的依赖关系或属性设置是否合法，并在需要时抛出异常或警告。
     * 修改属性值：BeanPostProcessor 可以在 bean 初始化前后对属性值进行修改或替换。这可以用于注入特定的默认值、解析占位符或进行属性转换等操作。
     * 总而言之，BeanPostProcessor 接口提供了一种机制，允许开发人员在 bean 初始化过程中对其进行定制化处理。通过实现该接口并注册为 Spring 的 BeanPostProcessor，可以在应用程序上下文中对 bean 进行额外的操作和定制。
     */

    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        log.info("[postProcessBeforeInitialization] ===== beanName : {}, class : {}", beanName, bean.getClass());
        return bean;
    }


    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//        log.info("[postProcessAfterInitialization] beanName : {}, class : {}", beanName, bean.getClass());
        return bean;
    }

}
